﻿// MIT License
// 开源地址：https://gitee.com/co1024/AbcMvc
// Copyright (c) 2021-2023 1024
// Abc.Mvc=Furion+EF+SqlSugar+Pear layui admin.

using Abc.Core.EventBus;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;

namespace Abc.Core;

[AppStartup(800)]
public class CoreStartup : AppStartup
{
    public void ConfigureServices(IServiceCollection services)
    {


        #region RabbitMQ

        //需要安装：Install-Package RabbitMQ.Client -Version 6.4.0

        //services.AddEventBus(options =>
        //{
        //    // 创建连接工厂
        //    var factory = new ConnectionFactory
        //    {
        //        UserName = "admin",
        //        Password = "q1w2e3",
        //    };

        //    // 创建默认内存通道事件源对象，可自定义队列路由key，比如这里是 eventbus
        //    var rbmqEventSourceStorer = new RabbitMQEventSourceStorer(factory, "eventbus", 3000);

        //    // 替换默认事件总线存储器
        //    options.ReplaceStorer(serviceProvider =>
        //    {
        //        return rbmqEventSourceStorer;
        //    });
        //});
        #endregion

        #region Kafka
        //Install-Package Confluent.Kafka -Version 1.9.3
        //services.AddEventBus(options =>
        //{
        //    var consumerConf = new ConsumerConfig
        //    {
        //        BootstrapServers = "xxx.xxx.xxx.xxx:9092",
        //        GroupId = "Consumer",
        //        AutoOffsetReset = AutoOffsetReset.Earliest // 从最早的开始消费起
        //    };

        //    var producerConf = new ProducerConfig
        //    {
        //        BootstrapServers = "xxx.xxx.xxx.xxx:9092",
        //        BatchSize = 16384, // 修改批次大小为16K
        //        LingerMs = 20 // 修改等待时间为20ms
        //    };

        //    // 创建默认内存通道事件源对象，可自定义队列路由key，比如这里是 eventbus
        //    var kafkaEventSourceStorer = new KafkaEventSourceStore(consumerConf, producerConf, "testTopic", 30000);

        //    // 替换默认事件总线存储器
        //    options.ReplaceStorer(serviceProvider =>
        //    {
        //        return kafkaEventSourceStorer;
        //    });
        //});
        #endregion

        #region Redis
        //services.AddEventBus(builder =>
        //{
        //    // 替换事件源存储器
        //    builder.ReplaceStorer(serviceProvider =>
        //    {
        //        var redisClient = serviceProvider.GetService<IRedisClient>();
        //        return new RedisEventSourceStorer(redisClient);
        //    });

        //    // Furion 4.7.6 版本新增 ReplaceStorerOrFallback ，可在自定义事件源存储器初始失败时回退到默认值
        //    builder.ReplaceStorerOrFallback(() => new YourEventSourceStorer());
        //    // 支持 IServiceProvider 参数
        //    builder.ReplaceStorerOrFallback(serviceProvider =>
        //    {
        //        return new YourEventSourceStorer();
        //    });

        //});
        #endregion

        #region 关系数据库【低频率可以用，高频不建议】

        services.AddConfigurableOptions<EventBusOptions>();
        // 注册 EventBus 服务
        services.AddEventBus(builder =>
        {
            //在 Furion 中可以不用通过 builder.AddSubscriber<T>() 方式一一注册，只需要实现 ISingleton 接口即可
            //public class ToDoEventSubscriber : IEventSubscriber, ISingleton

            // 替换事件源存储器
            builder.ReplaceStorer(serviceProvider =>
            {
                return new RdbEventSourceStorer();
            });
            // 添加事件执行监视器
            builder.AddMonitor<ToDoEventHandlerMonitor>();
            // 添加事件执行器
            builder.AddExecutor<RetryEventHandlerExecutor>();
            // 订阅 EventBus 未捕获异常
            builder.UnobservedTaskExceptionHandler = (obj, args) =>
            {
                LogEx.Error($"obj:{obj.ToString()}\r\nargs:{args.Exception?.ToStringEx()}", "EventBus\\异常日志");
            };
        });
        #endregion

    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
    }
}